package com.dy.design_pattern_study.state_pattern.dome3;

import com.dy.design_pattern_study.state_pattern.dome2.entry.Context;
import com.dy.design_pattern_study.state_pattern.dome2.impl.ConcreteStateA;
import com.dy.design_pattern_study.state_pattern.dome3.entry.Work;

/**
 * @CreateBy zhangdingyi
 * @Date 2023-04-06
 * @Content 状态模式（State），当一个对象的内在状态改变时允许改变其行为，这个对象看起来像是改变了其类。
 *
 * 在什么时候使用？
 * 状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。
 * 把状态的判断逻辑转移到表示不同状态的一系列类当中，可以把复杂的判断逻辑简化
 * --简单的讲就是在 复杂的 if-else 中使用，这里是把多重的if-else 分开，
 * 每个if-else 都是一个独立的类，还有对应的状态类，可以自由的穿插这些类中
 * 这就是面向对象啊，把每一个部分都分得彻底，拿来即用
 *
 * 优点与缺点
 * 优点：
 * 1.将与特定状态相关的行为局部化，并且将不同状态的行为分割开来 -就是if-else 拆分成一个类的方法来使用
 * 2.将特定的状态相关的行为都放入一个对象中，由于所有与状态相关的代码都存在于某个ConcreteState中，
 * 所以通过定义新的子类可以很容易地增加新的状态和转换
 * 3.状态模式通过把各种状态转移逻辑分布到State的子类之间，来减少相互间的依赖
 * 4.当一个对象的行为取决于它的状态，并且它必须在运行时刻根据状态改变它的行为时，就可以考虑使用状态模式了
 * 目的：消除庞大的条件分支语句
 * 以上的总结就是
 * 在 复杂的分支判断语句中，把分支拆分成对象来使用（具体的状态也可以进行拆分）
 *
 *
 *
 *
 */
public class client {
    public static void main(String[] args) {
        /*
            什么是面向对象？
            这就是面向对象
            把一切都转换成对象，判断、功能、接口 一切都是对象，
            解决问题都是以对象为基础，降低耦合，尽量减少 if-else 和 switch
         */

        //紧急项目
        Work emergencyProjects = new Work();
        emergencyProjects.setHour(9);
        emergencyProjects.writeProgram();
        emergencyProjects.setHour(10);
        emergencyProjects.writeProgram();
        emergencyProjects.setHour(12);
        emergencyProjects.writeProgram();
        emergencyProjects.setHour(13);
        emergencyProjects.writeProgram();
        emergencyProjects.setHour(14);
        emergencyProjects.writeProgram();
        emergencyProjects.setHour(17);

        //emergencyProjects.setFinish(true);
        emergencyProjects.setFinish(false);

        emergencyProjects.writeProgram();
        emergencyProjects.setHour(19);
        emergencyProjects.writeProgram();
        emergencyProjects.setHour(22);
        emergencyProjects.writeProgram();

    }
}
